
#include <iostream>
#include <cstdlib>
#include <mutex>
#include <unordered_map>
#include <string>

// 用于存储每次内存分配的详细信息
struct AllocationInfo {
    size_t size;
    const char* file;
    int line;
};

// 全局互斥锁，确保线程安全
static std::mutex alloc_mutex;

// 全局映射表，存储指针与分配信息的对应关系
static std::unordered_map<void*, AllocationInfo> allocation_map;

// 重载的 new 运算符，接受大小、文件和行号参数
void* operator new(size_t size, const char* file, int line) {
    void* ptr = std::malloc(size);
    if (!ptr) {
        throw std::bad_alloc();
    }
    
    std::lock_guard<std::mutex> lock(alloc_mutex);
    allocation_map[ptr] = {size, file, line};
    
    std::cout << "分配内存: " << ptr << " (大小: " << size 
              << " bytes, 位置: " << file << ":" << line << ")\n";
    
    return ptr;
}

// 重载的 delete 运算符
void operator delete(void* ptr) noexcept {
    if (!ptr) return;
    
    std::lock_guard<std::mutex> lock(alloc_mutex);
    auto it = allocation_map.find(ptr);
    if (it != allocation_map.end()) {
        std::cout << "释放内存: " << ptr << " (大小: " << it->second.size 
                  << " bytes, 分配于: " << it->second.file << ":" << it->second.line << ")\n";
        allocation_map.erase(it);
    } else {
        std::cout << "释放未知内存: " << ptr << "\n";
    }
    
    std::free(ptr);
}

// 重载的 new[] 运算符
void* operator new[](size_t size, const char* file, int line) {
    return operator new(size, file, line);
}

// 重载的 delete[] 运算符
void operator delete[](void* ptr) noexcept {
    operator delete(ptr);
}

// 定义 DEBUG_NEW 宏来捕获文件位置和行号信息
#define DEBUG_NEW new(__FILE__, __LINE__)
#define new DEBUG_NEW

// 示例使用
int main() {
    // 分配单个整数
    int* num = new int(42);
    
    // 分配数组
    int* arr = new int[10];
    
    // 释放内存
    delete num;
    delete[] arr;
    
    return 0;
}


// 手动分解版本

new(__FILE__, __LINE__) int(10) 实际上等效于：

void* raw_memory = operator new(sizeof(int), __FILE__, __LINE__);
int* obj = static_cast<int*>(raw_memory);
// 调用构造函数（编译器自动插入）
obj->int::int(10);  // 在分配的内存上构造 int 对象